package com.remainder.oss.s3.core;

import java.io.InputStream;
import java.util.List;

import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;

/**
 * oss操作模板
 *
 * @author remainder
 * @date 2023/3/18 18:15
 **/
public interface OssTemplate<T1> {

    /**
     * 创建bucket
     *
     * @param bucketName
     *            bucket名称
     */
    void createBucket(String bucketName);

    /**
     * 获取所有的bucket
     *
     * @return bucket集合
     */
    List<Bucket> getAllBuckets();

    /**
     * 通过bucket名称删除bucket
     *
     * @param bucketName
     *            bucket名
     */
    void removeBucket(String bucketName);

    /**
     * 上传文件
     *
     * @param bucketName
     *            bucket名称
     * @param objectName
     *            文件名称
     * @param stream
     *            文件流
     * @param contextType
     *            文件类型
     */
    void putObject(String bucketName, String objectName, InputStream stream, String contextType);

    /**
     * 上传文件
     *
     * @param bucketName
     *            bucket名称
     * @param objectName
     *            文件名称
     * @param stream
     *            文件流
     */
    void putObject(String bucketName, String objectName, InputStream stream);

    /**
     * 获取文件
     *
     * @param bucketName
     *            bucket名称
     * @param objectName
     *            文件名称
     * @return S3Object
     */
    S3Object getObject(String bucketName, String objectName);

    /**
     * 获取对象的url
     *
     * @param bucketName
     * @param objectName
     * @param expires
     * @return
     */
    String getObjectURL(String bucketName, String objectName, Integer expires);

    /**
     * 通过bucketName和objectName删除对象
     *
     * @param bucketName
     * @param objectName
     */
    void removeObject(String bucketName, String objectName) throws Exception;

    /**
     * 根据文件前置查询文件
     *
     * @param bucketName
     *            bucket名称
     * @param prefix
     *            前缀
     * @param recursive
     *            是否递归查询
     * @return S3ObjectSummary 列表
     */
    List<S3ObjectSummary> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive);

    /**
     * @return Sts信息
     */
    T1 getScrip();
}
